package com.ctu.autodial;

import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.ctu.app.utils.CommonUtils;
//import com.ctu.app.utils.LogUtil;

import com.ctu.app.utils.ConfigureLog4J;

import android.app.Application;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;

/**
 * 将异常处理交给application管理
 * 
 * @author wxm
 * 
 */
public class CrashHandler implements UncaughtExceptionHandler {

	private static final String TAG = "CrashHandler";
	static CrashHandler INSTANCE = new CrashHandler();
	Context mContext;
	private static UncaughtExceptionHandler defaultExceptionHandler;
	private SimpleDateFormat format = new SimpleDateFormat(
			"yyyy-MM-dd-HH-mm-ss");// 用于格式化日期,作为日志文件名的一部分
	private String exStr;
	Application application;
	private static final String EXCEPTION_FILE_NAME = "AutoDialRunException";
	List<RechargeInfo> list = new ArrayList<RechargeInfo>();
	private static Logger runLogger;

	public CrashHandler() {
		runLogger = ConfigureLog4J.configure();
	}

	/**
	 * 获取CrashHandler实例 ,单例模式
	 * 
	 * @return
	 */
	public static CrashHandler getInstance() {
		return INSTANCE;
	}

	/**
	 * 
	 * @param context
	 */
	public void init(Context context) {
		mContext = context;
		// 获取系统默认的UncaughtException处理器
		defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
		// 设置该CrashHandler为程序的默认处理器
		Thread.setDefaultUncaughtExceptionHandler(this);
	}

	/**
	 * 对异常进行处理，线程未捕获异常处理器
	 */
	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		Log.d(TAG, "uncaughtException");
		if (!handleException(ex) && defaultExceptionHandler != null) { // 当UncaughtException发生时会转入该重写的方法来处理
			defaultExceptionHandler.uncaughtException(thread, ex);

			runLogger.info("捕获到异常：----uncaughtException");
			// LogUtil.saveLog2File("捕获到异常：----uncaughtException");
			runLogger.error("捕获到异常...", ex);
			// LogUtil.saveExceptionLog2File(ex, EXCEPTION_FILE_NAME);
			// LogUtil.saveExceptionLog2File(ex, EXCEPTION_FILE_NAME);

		} else {// 处理异常事件

			/* 如果处理了，让程序继续运行3秒再退出，保证文件保存并上传到服务器 */
			new Thread(new Runnable() {
				public void run() {
					try {
						Thread.sleep(3 * 1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
						runLogger.error("捕获sleep异常: " + e.getMessage(), e);
						// LogUtil.saveExceptionLog2File(
						// "捕获sleep异常: " + e.getMessage(),
						// EXCEPTION_FILE_NAME);

					}
				}
			}).start();

			runLogger.error("程序发生异常...", ex);
			// LogUtil.saveExceptionLog2File(ex, EXCEPTION_FILE_NAME);
			// 重启程序
			// android.os.Process.killProcess(android.os.Process.myPid());
			// System.exit(1);

		}

	}

	/**
	 * 处理异常
	 * 
	 * 将异常日志保存到文件中，定时将文件上传到服务器
	 * 
	 * @param ex
	 * @return
	 */
	public boolean handleException(Throwable ex) {
		if (ex == null)
			return false;

		// // 很抱歉,程序出现异常,即将退出
		// collectDeviceInfo(mContext);
		runLogger.error("捕获到异常：----handleException");
		// LogUtil.saveLog2File("捕获到异常：----handleException");
		if (ex.toString().contains("IllegalStateException")) {// startRecording()

			runLogger.error("实例方法调用失败...");
			// LogUtil.saveLog2File("实例方法调用失败...查看/sdcard/log/AutoDialRunException.log");
			try {
				Thread.sleep(3 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			CommonUtils.reboot();
		} else if (ex.toString().contains("NullPointerException")) {
			runLogger.error("空指针异常...");// 重启应用
			// LogUtil.saveLog2File("空指针异常...查看/sdcard/log/AutoDialRunException.log");//
			// 重启应用
			try {
				Thread.sleep(3 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// CommonUtils.reboot();

		} else if (ex.toString().contains("RuntimeException")) {
			runLogger.error("运行时异常...");
			// LogUtil.saveLog2File("运行时异常...查看/sdcard/log/AutoDialRunException.log");
			try {
				Thread.sleep(3 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}
		
		runLogger.error("主动处理异常...", ex);
		// LogUtil.saveExceptionLog2File(ex, EXCEPTION_FILE_NAME);

		runLogger.error("程序异常退出，保存充值信息，并重启设备...");
		// LogUtil.saveLog2File("程序异常退出，保存充值信息，并重启设备...");

		return true;
	}

	private void upLog2Server() {

		System.out.println("定时将文件上传到服务器");

	}

}
